package com.jacobson.core.widget.adapter

import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView

/**
 * 适配器代理
 *
 * @author wucz on 2017-11-29.
 */

interface AdapterDelegate<T> {
    /**
     * 当 [RecyclerView.Adapter.getItemViewType]时候会调用该方法确认是否由该代理负责。<br></br>
     * 在该方法中根据传入的数据判断是否由该代理来负责处理<br></br>
     * **注意:该方法返回值处理**
     *
     *  * false-那么后续的方法都不会调用
     *  * true-那么后续的方法如果有需要的话都会分配到该代理去处理
     *
     *
     * @param items    适配器数据
     * @param position 索引位置
     * @return 如果该项数据由该代理负责返回true, 否则返回false
     */
    fun isForViewType(items: T?, position: Int): Boolean

    /**
     * 当RecycleView需要创建一个新的ViewHolder且 [.isForViewType]返回 [true]
     * 的时候会调用该方法创建新的View。 <br></br>
     * 在该方法中创建一个新的满足 get
     *
     * @param parent 父容器
     * @return 根据 viewType 创建的新的控件类型
     * @see .isForViewType
     * @see .onBindViewHolder
     * @see .onBindViewHolder
     */
    fun onCreateViewHolder(parent: ViewGroup): RecyclerView.ViewHolder

    /**
     * 当RecycleView需要显示下标为 position 的数据时调用该方法<br></br>
     *
     * @param items    数据集合
     * @param holder   ViewHoder
     * @param position 位置
     */
    fun onBindViewHolder(items: T?, holder: RecyclerView.ViewHolder, position: Int)

    /**
     * 数据与试图绑定
     *
     * @param items    数据集合
     * @param holder   ViewHolder
     * @param position 位置
     * @param payloads 局部更新参数
     */
    fun onBindViewHolder(items: T?, holder: RecyclerView.ViewHolder, position: Int, payloads: List<*>)

    /**
     * 当某个由此适配器创建的视图已被回收时调用。<br></br>
     * 当项目视图中有大量的数据绑定的时候，比如一张很大的位图，可以在这里进行资源回收。
     *
     * @param holder 用于回收的视图
     */
    fun onViewRecycled(holder: RecyclerView.ViewHolder)

    /**
     * View不能进行Recycle的时候回调，比如瞬时的View。<br></br>
     * 用法见 [RecyclerView.Adapter.onFailedToRecycleView]
     *
     * @param holder ViewHolder
     * @return True if the View should be recycled, false otherwise. Note that if this method
     * returns `true`, RecyclerView *will ignore* the transient state of
     * the View and recycle it regardless. If this method returns `false`,
     * RecyclerView will check the View's transient state again before giving a final decision.
     * Default implementation returns false.
     */
    fun onFailedToRecycleView(holder: RecyclerView.ViewHolder): Boolean

    /**
     * Called When View Attached To Window<br></br>
     *
     * @param holder ViewHolder
     * @see RecyclerView.Adapter.onViewAttachedToWindow
     */
    fun onViewAttachedToWindow(holder: RecyclerView.ViewHolder)

    /**
     * Called When View Detached From Window<br></br>
     *
     * @param holder ViewHolder
     * @see RecyclerView.Adapter.onViewDetachedFromWindow
     */
    fun onViewDetachedFromWindow(holder: RecyclerView.ViewHolder)
}
